←Select platform

CreateAttachmentStream Method

Summary

Creates a stream to the attachment file binary data.

Syntax
C#
C++/CLI
Python
public Stream CreateAttachmentStream( 
   int attachmentNumber, 
   ObjectCache cache 
) 
public:  
   Stream^ CreateAttachmentStream( 
      Int32 attachmentNumber, 
      ObjectCache^ cache 
   ) 
def CreateAttachmentStream(self,attachmentNumber,cache): 

Parameters

attachmentNumber

1-based attachment number in this LEADDocument. This DocumentAttachments collection must contain an item with DocumentAttachment.AttachmentNumber equal to this value, otherwise an exception is thrown.

cache

Cache object to use. This is optional, see the Remarks section.

Return Value

Stream to the attachment file binary data if successful; otherwise, null. The application program must close (dispose) the stream after use.

Remarks

CreateAttachmentStream works as follows:

  1. Obtains the DocumentAttachment object identified by attachmentNumber.
  2. If the value of DocumentAttachment.DocumentId is not null, then it is assumed that the attachment document exists in the cache, and a stream to its data is created and returned.
  3. Otherwise, if the value of DocumentAttachment.IsEmbedded is true then it is assumed that the attachment is embedded in the owner document, and a stream to its data is created and returned.
  4. If all of the above fails, then null is returned.

In all cases, it is the application program's responsibility to dispose the stream returned by this method.

For more information, refer to Document Attachments.

Example
C#
using Leadtools; 
using Leadtools.Codecs; 
using Leadtools.Document.Writer; 
 
using Leadtools.Document; 
using Leadtools.Caching; 
using Leadtools.Annotations.Engine; 
using Leadtools.Ocr; 
using Leadtools.Barcode; 
using Leadtools.Document.Converter; 
 
public void AttachmentsExample() 
{ 
   // The PDF document can be one of the following: 
   // 1. Normal PDF without attachments. Has one or more pages and no attachments. 
   // 2. Normal PDF with attachments. Has one or more pages and one or more attachments. 
   // 3. PDF Portfolio. Has a placeholder page and one or more attachments. 
 
   // The value of LoadDocumentOptions.LoadAttachmentsMode affects loading the documents as follows: 
 
   // 1. Normal PDF without attachments: Will not be affected. 
   // 2. Normal PDF with attachments: Number of pages is not affected. 
   //    Number of attachments is: 
   //       LoadAttachmentsMode = None then 0 
   //       LoadAttachmentsMode = AsAttachments then number of attachments found in the document. 
   // 3. PDF Portfolio: Number of pages is: 
   //       LoadAttachmentsMode = None then 1 (the placeholder page) 
   //       LoadAttachmentsMode = AsAttachments then 0 (the document has no pages). 
   //    Number of attachments is: 
   //       LoadAttachmentsMode = None then 0 
   //       LoadAttachmentsMode = AsAttachments then number of attachments found in the document. 
 
   // First, load the document without attachments 
   string pdfFile = Path.Combine(LEAD_VARS.ImagesDir, "Leadtools.pdf"); 
   string outputDirectory = Path.GetDirectoryName(LEAD_VARS.ImagesDir); 
 
   Console.WriteLine($"Loading with DocumentLoadAttachmentsMode.None"); 
   var loadDocumentOptions = new LoadDocumentOptions(); 
   loadDocumentOptions.LoadAttachmentsMode = DocumentLoadAttachmentsMode.None; 
   using (LEADDocument document = DocumentFactory.LoadFromFile(pdfFile, loadDocumentOptions)) 
   { 
      Console.WriteLine(document.GetDocumentFileName()); 
      Console.WriteLine($"Document has {document.Pages.Count} pages"); 
 
      // Find out if the document is portfolio 
      bool isPortfolio = 
         document.Metadata.ContainsKey(LEADDocument.MetadataKey_IsPortfolio) && 
         bool.Parse(document.Metadata[LEADDocument.MetadataKey_IsPortfolio]); 
      Console.WriteLine($"IsPortfolio:{isPortfolio}"); 
 
      // Check that everything is as expected 
 
      // We should have 0 attachments since we did not instruct the toolkit to load these 
      Debug.Assert(document.Attachments.Count == 0); 
 
      // We should have one or more pages regardless of whether the document is PDF portfolio 
      Debug.Assert(document.Pages.Count > 0); 
   } 
 
   // Next, load the document with attachments 
   Console.WriteLine($"Loading with DocumentLoadAttachmentsMode.AsAttachments"); 
   loadDocumentOptions.LoadAttachmentsMode = DocumentLoadAttachmentsMode.AsAttachments; 
   using (LEADDocument document = DocumentFactory.LoadFromFile(pdfFile, loadDocumentOptions)) 
   { 
      document.AutoDeleteAttachmentsFromCache = true; 
             
      Console.WriteLine($"Document has {document.Pages.Count} pages"); 
 
      // Find out if the document is portfolio 
      bool isPortfolio = 
         document.Metadata.ContainsKey(LEADDocument.MetadataKey_IsPortfolio) && 
         bool.Parse(document.Metadata[LEADDocument.MetadataKey_IsPortfolio]); 
      Console.WriteLine($"IsPortfolio:{isPortfolio}"); 
 
      // Check that everything is as expected 
 
      // We may have 0 or more attachments depending on the file 
      Console.WriteLine($"Document has {document.Attachments.Count} attachments"); 
 
      // We should have one or more pages unless this is PDF portfolio, then it will have 0 pages 
      if (isPortfolio) 
      { 
         Debug.Assert(document.Pages.Count == 0); 
      } 
 
      // Extract all the attachments into the output directory 
      foreach (DocumentAttachment attachment in document.Attachments) 
      { 
         // Show info on this attachment 
         Console.WriteLine($"Attachment number {attachment.AttachmentNumber} file name is '{attachment.FileName}', " + 
            $"length is {attachment.FileLength} bytes, and ID is {attachment.DocumentId}, Is Embedded: {attachment.IsEmbedded}"); 
         // Get the attachment file name 
         // This value may not be unique, so combine it with the attachment number 
         string attachmentFileName = $"{attachment.AttachmentNumber}-{attachment.FileName}"; 
         attachmentFileName = Path.Combine(outputDirectory, attachmentFileName); 
 
         // Get the attachment as a stream, we do not want to save it to the cache so pass null for that 
         // DocumentAttachments reference 
         using (Stream attachmentStream = document.Attachments.CreateAttachmentStream(attachment.AttachmentNumber, null)) 
         { 
            if (attachmentStream != null) 
            { 
               // Save it to the output file 
               using (var stream = File.Create(attachmentFileName)) 
               { 
                  document.SaveAttachmentToCache(null); 
                  attachmentStream.CopyTo(stream); 
               } 
            } 
         } 
 
         var saveOptions = new SaveAttachmentToCacheOptions(); 
         saveOptions.AttachmentNumber = 0; 
         saveOptions.UpdateAttachmentDocumentId = true; 
         saveOptions.UploadDocumentOptions = new UploadDocumentOptions(); 
         document.SaveAttachmentToCache(saveOptions); 
 
         // Or load this attachment as a LEADDocument, this might fail if the attachment is not of a valid image 
         // or document format 
         try 
         { 
            Console.WriteLine("Loading as LEADDocument"); 
            var loadAttachmentOptions = new LoadAttachmentOptions(); 
            loadAttachmentOptions.AttachmentNumber = attachment.AttachmentNumber; 
            loadAttachmentOptions.UpdateAttachmentDocumentId = true; 
            using (LEADDocument attachmentDocument = document.LoadDocumentAttachment(loadAttachmentOptions)) 
            { 
               Console.WriteLine($"Success, attachment document mime type is {attachmentDocument.MimeType} and has {attachmentDocument.Pages.Count} pages"); 
            } 
         } 
         catch (Exception ex) 
         { 
            Console.WriteLine($"Error {ex.Message}"); 
         } 
      } 
   } 
} 
 
static class LEAD_VARS 
{ 
   public const string ImagesDir = @"C:\LEADTOOLS22\Resources\Images"; 
} 
Requirements

Target Platforms

Help Version 22.0.2023.4.21
Products | Support | Contact Us | Intellectual Property Notices
© 1991-2023 LEAD Technologies, Inc. All Rights Reserved.

Leadtools.Document Assembly
Products | Support | Contact Us | Intellectual Property Notices
© 1991-2023 LEAD Technologies, Inc. All Rights Reserved.